// readAudioSource.js
import * as fs from 'node:fs'
import * as path from 'node:path'
import { parseFile, parseBuffer } from 'music-metadata'

/**
 * 读取音频文件元数据并返回结构化音源对象
 * @param {string|Buffer} source - 文件路径 或 Buffer
 * @returns {Promise<Object|null>} 音源对象，失败返回 null
 */
async function readAudioSource(source: string | Buffer) {
  try {
    let metadata
    let fileBuffer

    // 判断是路径还是 Buffer
    if (typeof source === 'string') {
      debugger
      // 注意：因项目编译后的代码位于 out/main/index.js，而不是源码目录，
      // 所以需要使用 ../../resources/localMusic 路径指向编译后的 resources
      let _source = path.join(__dirname, source)

      // E:\5Project\PCByElectronProject\electron-app\resources\localMusic
      console.log('文件路径', _source)

      // 是文件路径
      if (!fs.existsSync(_source)) {
        throw new Error('文件不存在')
      }
      metadata = await parseFile(_source)
      fileBuffer = fs.readFileSync(_source)
    } else if (Buffer.isBuffer(source)) {
      // 是 Buffer
      metadata = await parseBuffer(source)
      fileBuffer = source
    } else {
      throw new Error('source 必须是文件路径（string）或 Buffer')
    }

    const common = metadata.common
    const format = metadata.format

    // 提取封面图（如果有）
    let coverBase64 = ''
    let coverMimeType = null
    let coverBuffer: Buffer<any> = Buffer.from([])

    if (common.picture && common.picture.length > 0) {
      const picture = common.picture[0]
      coverMimeType = picture.format // e.g., 'image/jpeg'
      coverBuffer = Buffer.from(picture.data) // 保持为 Buffer
      coverBase64 = `data:${coverMimeType};base64,${coverBuffer.toString('base64')}`
    }

    // 构造音源对象
    const audioSource = {
      // 基本信息
      title: common.title || null,
      artist: common.artist || null,
      album: common.album || null,
      year: common.year || null,
      genre: common.genre || null,
      track: common.track || null,
      disk: common.disk || null,

      // 音频信息
      duration: format.duration || null, // 秒
      bitrate: format.bitrate || null,
      sampleRate: format.sampleRate || null,
      channels: format.numberOfChannels || null,
      codec: format.codec || null,
      container: format.container || null,

      // 封面图（推荐使用 Buffer，Base64 用于前端展示）
      cover: {
        data: coverBuffer, // Buffer 形式（适合存储、传输）
        base64: coverBase64, // Base64 字符串（适合前端 <img src>）
        mimeType: coverMimeType // 如 'image/jpeg', 'image/png'
      },

      // 文件信息
      size: fileBuffer.length,
      sourceType: typeof source === 'string' ? 'file' : 'buffer',
      filePath: typeof source === 'string' ? path.resolve(source) : null
    }

    return audioSource
  } catch (error: any) {
    console.error('读取音频元数据失败:', error.message)
    return null
  }
}

export { readAudioSource }
